Github Actions와 CodeBuild로 CI Build 환경 설정하기

0. 도입배경

Jenkins의 비용과 성능 문제로 인해 다른 CI/CD툴을 찾기로 결정했습니다.

Trigger는 Github Actions를 사용하고 Build는 AWS CodeBuild, Deploy는 AWS CodeDeploy를 선택했습니다. AWS 설계는 다음과 같습니다.

image

1. AWS VPC 설정

image

AWS CodeBuild는 NAT Gateway를 사용하여 Private Subnet에서 작동합니다. CodeBuild를 만들기 전에 VPC에서 Subnet 설정을 우선으로 합니다.

1.1 Subnet 생성

image

image

VPC를 지정하고 서브넷 세팅합니다.

image

  • 서브넷 이름: 구분할 수 있는 이름 지정.
  • 가용 영역: 가용 영역을 지정합니다. 여기서는 AWS가 2b, 2d지역에선 못만들게 하니 2a, 2c로 지정하겠습니다.
  • IPv4 CIDR: 서브넷 블록이 서로 겹치지 않게 설정.

저는 2개의 서브넷을 생성했습니다.

1.2 NAT 게이트웨이 생성

image

NAT 게이트웨이를 생성합니다.

image

  • 이름: 구분할 수있는 이름을 짓습니다.
  • 서브넷: NAT 게이트웨이를 생성할 퍼블릭 서브넷을 선택합니다.
  • 탄력적 IP 할당: elastic IP를 설정합니다.

1.3 라우팅 테이블 설정하기

image

라우팅 테이블을 생성하고 태그 추가해서 Name을 지정합니다.

image

라우팅 편집을 합니다.

image

라우팅 편집

image

  • 대상: 0.0.0.0/0 으로 설정
  • NAT-Gateway로 설정합니다.

→ 서브넷 연결 편집

image

NAT Gateway에서 private 서브넷 대상만 추가합니다.

image

2. AWS CodeBuild 설정하기

image

2.1 AWS IAM 역할 생성하기

image

권한 정책에서 codebuild를 연결합니다.

image

역할 이름을 Codebuild로 명확히 합니다.

image

2.2 AWS CodeBuild 만들기

image

프로젝트 이름을 지정합니다.

image

소스 공급자에서 Github를 연결합니다.

image

빌드 환경을 설정합니다.

image

image

  • 서비스 역할 → 기존 서비스 역할 → 역할 ARN에서 이전의 IAM 설정을 추가합니다.

Additional configuration 설정

image

  • Timeout: 타임아웃 설정하기
  • VPC
  • Subnets: 이전에 설정한 NAT 서브넷을 추가합니다.
  • Security groups: NAT 서브넷에 설정한 Security group으로 설정합니다.

    • 전부 설정이 완료되었다면 Validate VPC Settings를 눌러 확인합시다.

image

초록색으로 확인이 되었다면?

  • compute: 빌드 환경을 결정합니다.
  • Environment variables: 환경변수 설정
  • File systems

image

  • Buildspec: buildspec 파일 사용합니다. → Github 루트에 buildspec.yml을 생성하면 됩니다.
  • 배치 구성: 배치할 때 사용하면 됩니다.

image

  • 아티팩트

    • 유형: S3로 빌드파일을 보내기로 설정합니다.
    • 버킷 이름: S3 버킷이름
    • 이름: 빌드된 파일이름 (ex: build.zip)
    • 경로: 경로는 선택하지 않았습니다. 여러버전의 빌드파일을 선택하려면 경로를 선택해도 됩니다.
    • 아티팩트 패키징: ZIP를 선택합니다.
    • 추가 구성으로 캐시를 사용하려면 다음과 같이 설정합니다.

image

  • 캐시 유형: Amazon S3
  • 캐시 경로 접두사는 cache로 설정합니다.
  • 로그: 로그는 빌드 출력 로그를 S3에 저장할 것인지 선택하고 생성합니다.

2.3 buildspec.yml 설정하기

image

다음과 같이 루트에서 buildspec.yml을 생성합니다.

version: 0.2

phases:
  build:
    commands:
      - chmod +x ./gradlew
      - ./gradlew build
  post_build:
    commands:
      - echo $(basename ./build/libs/*.jar)
      - pwd

artifacts:
  files:
    - build/libs/*.jar
    - appspec.yml
    - beforeInstall.sh
    - deploy.sh
  discard-paths: yes
cache:
  paths:
    - '/root/.gradle/caches/**/*'
  • commands: 빌드 명령어입니다. gradle로 빌드하기 위한 명령어를 사용했습니다.
  • post_build: 빌드 이후 명령어로 해당 빌드가 되었는지 확인합니다. 삭제해도 무방합니다.
  • files: 어떤 파일들을 보낼껀지 결정합니다.

    • *.jar: 스프링 빌드 파일
    • appspec.yml: AWS CodeDeploy 배포용 yml
    • beforeInstall.sh, deploy.sh: appspec에 명시된 쉘스크립트 파일입니다.
  • cache: paths: 캐시파일 위치입니다.

여기까지 설정하면 AWS CodeBuild를 통하여 빌드하고 S3로 build.zip파일이 업로드가 됩니다.

image

3. Github Actions 설정하기

image

빌드할 Repository에서 Actions를 선택합니다.

image

.github/workflows/main.yml

name: Actions 이름

on:
  push:
    branches: [master]

jobs:
  buildAndTest:
    name: Github action CD
    runs-on: ubuntu-18.04
    defaults:
      run:
        shell: bash

    steps:
      - name: 체크아웃 Github-Action
        uses: actions/checkout@v2

      - name: AWS 설정
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: CodeBuild 실행
        uses: aws-actions/aws-codebuild-run-build@v1.0.3
        with:
          project-name: cicdtest

      - name: Code Deploy
        run: aws deploy create-deployment --application-name cicdtest --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name cicd-bluegreen --s3-location bucket=cicdtestsunny,bundleType=zip,key=build.zip
name: Actions 이름

on:
  push:
    branches: [master]

jobs:
  buildAndTest:
    name: Github action CD
    runs-on: ubuntu-18.04
    defaults:
      run:
        shell: bash
  • on: push: push냐 Pull Request냐 설정이 가능합니다.
  • branches: 브랜치 선택
  • buildAndTest: 대상을 지정하는 것으로 다른 이름(ex: backend 등등)으로 바꿀 수 있습니다.
  • runs-on: docker 이미지 환경
steps:
  - name: 체크아웃 Github-Action
    uses: actions/checkout@v2

이 코드를 빼면 Actions가 작동하지 않기 때문에 꼭 추가합니다.

- name: AWS 설정
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ap-northeast-2

IAM의 Access Key ID, Secret Access Key를 Github의 settings에 설정합니다.

image

- name: CodeBuild 실행
  uses: aws-actions/aws-codebuild-run-build@v1.0.3
  with:
    project-name: cicdtest

코드 빌드 실행합니다.

  • project-name: AWS CodeBuild에서 생성한 프로젝트 이름을 적습니다.
- name: Code Deploy
  run: aws deploy create-deployment --application-name cicdtest --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name cicd-bluegreen --s3-location bucket=cicdtestsunny,bundleType=zip,key=build.zip

이 내용은 다음에 설명할 AWS CodeDeploy 설정입니다.

여기까지 했으면 Github Actions 설정은 마쳤습니다.

다음은 AWS CodeDeploy 이용한 Blue/Green 무중단 배포를 설정해보겠습니다!

Trouble Shooting

CodeBuild에서 해당 에러가 났을 경우

image

image

브랜치를 지정하지 않아서 생긴 에러입니다. 브랜치를 꼭 적을 것!

출처

aws-actions/aws-codebuild-run-build

AWS CodeBuild을 Amazon Virtual Private Cloud와 함께 사용


Written by@Sunny Son
개발자는 오늘도 뚠뚠

GitHubFacebook